﻿using System;
using System.Collections.Generic;
using System.Text;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Columns;
using System.Drawing;
using System.Data;
using ProtocolVN.Framework.Core;
using ProtocolVN.DanhMuc;

namespace ProtocolVN.Framework.Win
{
    /// <summary>
    /// DUYVT
    /// Ràng buộc về hàng hóa tồn kho khi thực hiện xuất kho hay chuyển kho
    /// </summary>
    public class RangBuocTonKho : RangBuocRule
    {
        PLGridView DesGrid;
        DataTable DetailDataTable;
        PhieuType Des;
        long Kho_Id;
        
        public RangBuocTonKho() { }

        public RangBuocTonKho(PLGridView DesGrid, DataSet DetailDataSet, 
            DataSet GridDataSetSrc, PhieuType Des, long Kho_Id, bool? IsAdd)
        {
            this.DesGrid = DesGrid;
            if (DetailDataSet != null && DetailDataSet.Tables.Count > 0)
            {
                if (IsAdd == true)                
                    this.DetailDataTable = DetailDataSet.Tables[0];
                else
                {
                    foreach (DataRow rowLast in DetailDataSet.Tables[0].Rows)
                    {
                        foreach (DataRow rowFirst in GridDataSetSrc.Tables[0].Rows)
                        {
                            if (rowLast.RowState != DataRowState.Deleted)
                            {
                                if ((HelpNumber.ParseInt64(rowLast["HH_ID"]) ==
                                    HelpNumber.ParseInt64(rowFirst["HH_ID"]))
                                    && (HelpNumber.ParseInt64(rowLast[Des.GetSTTField()]) ==
                                    HelpNumber.ParseInt64(rowFirst[Des.GetSTTField()])))
                                {
                                    rowLast[Des.GetSOLGField()] =
                                        HelpNumber.ParseDecimal(rowLast[Des.GetSOLGField()]) -
                                        HelpNumber.ParseDecimal(rowFirst[Des.GetSOLGField()]);
                                    rowLast[Des.GetTRLGField()] =
                                        HelpNumber.ParseDecimal(rowLast[Des.GetTRLGField()]) -
                                        HelpNumber.ParseDecimal(rowFirst[Des.GetTRLGField()]);
                                }
                            }
                        }
                    }
                    this.DetailDataTable = DetailDataSet.Tables[0];
                }
            }
            this.Des = Des;
            this.Kho_Id = Kho_Id;
        }

        #region RangBuocRule Members  

        public List<InvalidInfo> Check()
        {
            throw new NotImplementedException();
        }
        #endregion

        public bool CheckTon()
        {
            //Kiểm tra ràng buộc về tồn kho
            //Kết quả trả về DataTable miêu tả các dòng vi phạm
            DataTable dt_vipham = KiemTraRangBuocTonKho();
            if (dt_vipham.Rows.Count != 0 && DesGrid != null)
            {                
                ShowErrorOnGrid(dt_vipham);
                return false;
            }
            else
                return true;            
        }

        /// <summary>
        /// Kiểm tra ràng buộc về tồn kho
        /// </summary>        
        /// <returns>DataTable miêu tả các dòng không hợp lệ</returns>
        public DataTable KiemTraRangBuocTonKho()
        {
            DataTable dtViPham = new DataTable();
            dtViPham.Columns.Add("HH_ID");            
            dtViPham.Columns.Add("TINH_TRANG");
            dtViPham.Columns.Add("VI_PHAM");

            if (DetailDataTable == null || DetailDataTable.Rows.Count == 0)
                return dtViPham;

            foreach (DataRow dr_dich in DetailDataTable.Rows)
            {
                if (dr_dich.RowState != DataRowState.Deleted)
                {
                    DataRow rowViPham = dtViPham.NewRow();
                    long kkd_hientai_id = DMKyKinhDoanh.get_KyTonKho_Max();
                    int error_code = KhoTonKhoHelp.CheckHangHoaTonKhoIsHopLe(
                        HelpNumber.ParseInt64(dr_dich["HH_ID"]), Kho_Id,
                        HelpNumber.ParseInt64(dr_dich[Des.GetSTTField()]), kkd_hientai_id,
                        HelpNumber.ParseDecimal(dr_dich[Des.GetSOLGField()]),
                        HelpNumber.ParseDecimal(dr_dich[Des.GetTRLGField()]));

                    if (error_code == -1)
                    {
                        rowViPham["HH_ID"] = dr_dich["HH_ID"];
                        rowViPham["TINH_TRANG"] = dr_dich[Des.GetSTTField()];
                        rowViPham["VI_PHAM"] = "Hàng hóa này không đủ cung cấp về số lượng";
                        dtViPham.Rows.Add(rowViPham);
                    }
                    else if (error_code == -2)
                    {
                        rowViPham["HH_ID"] = dr_dich["HH_ID"];
                        rowViPham["TINH_TRANG"] = dr_dich[Des.GetSTTField()];
                        rowViPham["VI_PHAM"] = "Hàng hóa này không đủ cung cấp về trọng lượng";
                        dtViPham.Rows.Add(rowViPham);
                    }
                    else if (error_code == -3)
                    {
                        rowViPham["HH_ID"] = dr_dich["HH_ID"];
                        rowViPham["TINH_TRANG"] = dr_dich[Des.GetSTTField()];
                        rowViPham["VI_PHAM"] = "Hàng hóa này không đủ cung cấp về số lượng và trọng lượng";
                        dtViPham.Rows.Add(rowViPham);
                    }
                    else if (error_code == -4)
                    {
                        rowViPham["HH_ID"] = dr_dich["HH_ID"];
                        rowViPham["TINH_TRANG"] = dr_dich[Des.GetSTTField()];
                        rowViPham["VI_PHAM"] = "Không tồn tại hàng hóa này trong kho";
                        dtViPham.Rows.Add(rowViPham);
                    }
                    else if (error_code == -5)
                        PLMessageBoxDev.ShowMessage(
                            "Đã có lỗi trong quá trình kiểm tra lượng hàng tồn kho");
                    else if (error_code == -6)
                    {
                        rowViPham["HH_ID"] = dr_dich["HH_ID"];
                        rowViPham["TINH_TRANG"] = dr_dich[Des.GetSTTField()];
                        rowViPham["VI_PHAM"] = "Hàng hóa này khi xuất khỏi kho sẽ dẫn đến \n số lượng tồn >0 và trọng lượng tồn=0 hoặc ngược lại";
                        dtViPham.Rows.Add(rowViPham);
                    }
                }   
            }
            return dtViPham;
        }

        /// <summary>
        /// Thể hiện lỗi trên Grid dựa vào DataTable chứa các dòng lỗi        
        /// </summary>        
        /// <param name="dt_error">DataTable các dòng lỗi</param>
        public void ShowErrorOnGrid(DataTable dt_error)
        {
            AddFormatCond(DesGrid);
            for (int i = 0; i < DesGrid.RowCount; i++)
            {
                DesGrid.SetRowCellValue(i, DesGrid.Columns["CHECK"], 1);
                DesGrid.SetRowCellValue(i, DesGrid.Columns["VI_PHAM"], "");
                foreach (DataRow dr_error in dt_error.Rows)
                {
                    DataRow rowDich = DesGrid.GetDataRow(i);
                    if ((HelpNumber.ParseInt64(rowDich["HH_ID"]) == 
                        HelpNumber.ParseInt64(dr_error["HH_ID"]))                        
                        && (HelpNumber.ParseInt64(rowDich[Des.GetSTTField()]) == 
                        HelpNumber.ParseInt64(dr_error["TINH_TRANG"])))
                    {
                        DesGrid.SetRowCellValue(i, DesGrid.Columns["CHECK"], 0);
                        DesGrid.SetRowCellValue(i, DesGrid.Columns["VI_PHAM"], dr_error["VI_PHAM"]);
                        DesGrid.UpdateCurrentRow();
                        DesGrid.OptionsView.ShowPreview = true;
                        DesGrid.OptionsView.AutoCalcPreviewLineCount = true;
                        DesGrid.PreviewFieldName = "VI_PHAM";
                        DesGrid.CustomDrawRowPreview +=
                            new DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventHandler(
                                gridDich_CustomDrawRowPreview);
                    }
                }
            }
        }

        /// <summary>
        /// Customize lại phần review của dòng trong PLGridView
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        public void gridDich_CustomDrawRowPreview(object sender, 
            DevExpress.XtraGrid.Views.Base.RowObjectCustomDrawEventArgs e)
        {
            e.Appearance.ForeColor = Color.Blue;
            e.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far;
            e.Appearance.Font = new Font("Tahoma", 8.25F, FontStyle.Italic);
        }  

        /// <summary>
        /// Khởi tạo định dạng lỗi trên Grid 
        /// </summary>
        /// <param name="grid">Grid cần khởi tạo định dạng lỗi</param>
        public void AddFormatCond(PLGridView grid)
        {
            DataSet ds = ((DataTable)grid.GridControl.DataSource).DataSet;

            //Khởi tạo cột Check
            GridColumn colCheck = new GridColumn();
            colCheck.FieldName = "CHECK";
            colCheck.Visible = false;
            if (!ds.Tables[0].Columns.Contains("CHECK"))
                ds.Tables[0].Columns.Add("CHECK");
            if (!grid.Columns.Contains(colCheck))
                grid.Columns.Add(colCheck);

            //Khởi tạo cột thông báo vi phạm
            GridColumn colVipham = new GridColumn();
            colVipham.FieldName = "VI_PHAM";
            colVipham.Visible = false;
            if (!ds.Tables[0].Columns.Contains("VI_PHAM"))
                ds.Tables[0].Columns.Add("VI_PHAM");
            if (!grid.Columns.Contains(colVipham))
                grid.Columns.Add(colVipham);

            StyleFormatCondition styleFormatCond = new StyleFormatCondition();
            styleFormatCond.Appearance.BackColor = System.Drawing.Color.Red;
            styleFormatCond.Appearance.Options.UseBackColor = true;
            styleFormatCond.ApplyToRow = true;
            styleFormatCond.Column = colCheck;
            styleFormatCond.Condition = DevExpress.XtraGrid.FormatConditionEnum.Equal;
            styleFormatCond.Value1 = 0;
            grid.FormatConditions.AddRange(new StyleFormatCondition[] { styleFormatCond });
        }       
    }
}
